// 单链表
#ifndef LINKED_LIST
#define LINKED_LIST

typedef char ElemType;

// 链表的结点，也可以代表一个链表（头指针）
// 当使用的是Node类型时表示这是一个链表节点，使用LinkedList类型时表示这是个链表，实质上是个Node类型指针表示头指针
typedef struct LNode
{
	ElemType data;		// 链表结点数据
	struct LNode *next; // 下一个结点
} Node, *LinkedList;

/**
 * 创建一个链表
 * @param list 传入空的链表头指针引用
 */
void initLinkedList(LinkedList &);

/**
 * 判断链表是否为空
 * @param list 传入的链表头指针
 * @return 是否为空
 */
int linkedListEmpty(LinkedList &);

/**
 * 返回链表长度
 * @param list 传入的链表头指针
 * @return 链表长度
 */
int linkedListLength(LinkedList &);

/**
 * 获取链表的某个元素
 * @param list 传入链表头指针
 * @param i 要取得的元素索引
 * @return 链表元素
 */
ElemType getLinkedListElem(LinkedList &, int);

/**
 * 获取某个元素在链表中的索引
 * @param list 传入链表头指针
 * @param e 要取得索引的元素
 * @return 元素索引，-1代表未找到元素
 */
int locateLinkedListElem(LinkedList &, ElemType);

/**
 * 返回链表某个元素的前一个元素
 * @param list 传入链表头指针
 * @param e 当前元素
 * @return e的前一个元素
 */
ElemType priorLinkedListElem(LinkedList &, ElemType);

/**
 * 返回链表某个元素的后一个元素
 * @param list 传入链表头指针
 * @param e 当前元素
 * @return e的后一个元素
 */
ElemType nextLinkedListElem(LinkedList &, ElemType);

/**
 * 在指定位置插入一个元素
 * @param list 传入链表头指针
 * @param i 插入位置（索引）
 * @param e 插入的元素
 */
void linkedListInsert(LinkedList &, int, ElemType);

/**
 * 删除指定位置的元素
 * @param list 传入链表头指针
 * @param i 要删除的元素位置
 * @return 返回被删除的元素
 */
ElemType linkedListDelete(LinkedList &, int);

/**
 * 单链表就地逆置
 * @param list 传入链表指针引用
 */
void linkedListReverse(LinkedList &);

/**
 * 对单链表中每个元素传入visit函数并调用
 * @param list 传入链表头指针
 * @param visit(ElemType&) 回调函数
 */
void linkedListTraverse(LinkedList &, void(ElemType &));

#include "./linked-list.cpp"

#endif